#include "service_favorites.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>



bool service_favorite_add(const char *video_url)
{
    if (video_url == NULL || strlen(video_url) == 0) {
        fprintf(stderr, "错误: 尝试收藏一个空的URL。\n");
        return false;
    }
    
    // 在添加前，先检查是否已经收藏过了，避免重复
    if (service_favorite_is_favorited(video_url)) {
        printf("提示: 该视频已经被收藏过了。\n");
        // 这里我们可以选择是返回成功还是失败，返回成功体验更好
        return true; 
    }

    //以追加的方式打开加入文件
    FILE *fp = fopen(FAVORITES_FILE_PATH, "a"); // "a" for append
    if (fp == NULL) {
        perror("错误: 无法打开收藏文件进行写入");
        return false;
    }

    fprintf(fp, "%s\n", video_url);
    fclose(fp);

    printf("收藏成功: %s\n", video_url);
    return true;
    
}

//检查url是否已存在收藏夹
bool service_favorite_is_favorited(const char *video_url)
{
    if (video_url == NULL || strlen(video_url) == 0)
    {
        return false;
    }

    //以只读打开收藏夹文件
    FILE* fp = fopen(FAVORITES_FILE_PATH,"r");
    if (fp == NULL)
    {
        perror("fopen error");
        return false;
    }

    //比较是否存在
    //使用一个新的函数自动读取一行的内容,和fgets对比可以不用手动分配内存
    //ssize_t getline(char **lineptr, size_t *n, FILE *stream);
    char *line = NULL;//定义getline的第一个参数存储行的内容
    size_t len = 0;     //行的长度
    bool is_found = false;  //
    while (getline(&line,&len,fp) != -1)//成功返回读取的字节数不包括'\n',失败返回-1
    {
        // 移除行尾的换行符
        line[strcspn(line, "\n")] = 0;
        if (strcmp(video_url, line) == 0) {
            is_found = true;
            break; // 找到了，就没必要继续读了
        }
    }

    fclose(fp);
    if (line) {
        free(line); // 手动释放 getline 分配的内存
    }

    return is_found;

}